/*
 * ControlListagemAgencia
 * 
 * Versão 1.0
 * 
 * Data de criação: 27/05/2013
 * 
 * Copyright (c)
 * Autor: Odair José Tanes
 * Matrícula: 2009209186
 * Disciplina: Projeto de Sistemas de Software
 * 
 * Protótipo criado para exercício da disciplina
 * 
 *______________________________________________________________________________
 * Correções a serem feitas:
 * 
 *  1 - Modificar a atualização da listagem via Observer e 
 *      remover createControlInclusaoAgencia()
 * 
 * 
 */
package edu.ufes.pss.exercicioSwingBanco.presenter;

import edu.ufes.pss.exercicioSwingBanco.view.ListaAgenciaView;
import edu.ufes.pss.exercicioSwingBanco.factory.DaoAgenciaFactory;
import edu.ufes.pss.exercicioSwingBanco.model.Agencia;
import edu.ufes.pss.exercicioSwingBanco.interfaces.DaoInterface;
import edu.ufes.pss.exercicioSwingBanco.interfaces.PersistivelInterface;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Iterator;
import java.util.TreeSet;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author OdairJT
 */
public class ListaAgenciaPresenter {

    private ListaAgenciaView view;
    private DefaultTableModel modelo;

    public ListaAgenciaPresenter() {

        this.view = new ListaAgenciaView();

        loadTblAgencias();

        addListernerTxtFiltrar();
        addListenerBtnNova();
        addListenerBtnRecarregar();
        addListenerBtnVisualizar();
        addListenerBtnExcluir();
        addListenerBtnFechar();

        this.view.setLocationRelativeTo(null);
        this.view.getTblAgencias().grabFocus();
        this.view.setVisible(true);

    }

    public final void loadTblAgencias() {
        this.modelo = new DefaultTableModel(new Object[]{"CÓDIGO", "CIDADE", "UF"}, 0) {
            @Override
            public boolean isCellEditable(int rowIndex, int mColIndex) {
                return false;
            }
        };

        this.view.getTblAgencias().setModel(modelo);
        this.view.getTblAgencias().setSelectionMode(0);
        this.view.getTblAgencias().setShowGrid(true);
        this.view.getTblAgencias().setBackground(Color.LIGHT_GRAY);
        this.view.getTblAgencias().setForeground(Color.BLUE);

        /* O padrão factory retorna a instância de acordo com a forma 
         * de persistencia selecionada
         */

        DaoInterface p = DaoAgenciaFactory.CriarDaoAgencia(1);

        TreeSet<PersistivelInterface> agencias = (TreeSet) p.buscarTodos();
        Iterator<PersistivelInterface> itAgencias = agencias.iterator();
        Agencia tempAgencia;

        while (itAgencias.hasNext()) {
            tempAgencia = (Agencia) itAgencias.next();
            this.modelo.addRow(new Object[]{tempAgencia.getCodigo(), tempAgencia.getCidade(), tempAgencia.getUf()});
        }
    }

    private void addListernerTxtFiltrar() {
        this.view.getTxtFiltrar().addFocusListener(
                new FocusListener() {
            @Override
            public void focusGained(FocusEvent fe) {
                focusGainedLostTxtFiltrar();
            }

            @Override
            public void focusLost(FocusEvent fe) {
                focusGainedLostTxtFiltrar();
            }
        });

        this.view.getTxtFiltrar()
                .addKeyListener(
                new KeyAdapter() {
            @Override
            public void keyReleased(KeyEvent ke) {
                actionPerformedTxtFiltrar();
            }
        });

    }

    private void focusGainedLostTxtFiltrar() {
        if (this.view.getTxtFiltrar().getText().equals("")) {
            this.view.getTxtFiltrar().setText("Filtrar");
        } else if (this.view.getTxtFiltrar().getText().equals("Filtrar")) {
            this.view.getTxtFiltrar().setText("");
        }
    }

    private void actionPerformedTxtFiltrar() {
        DaoInterface p = DaoAgenciaFactory.CriarDaoAgencia(1);

        TreeSet<PersistivelInterface> agencias = (TreeSet) p.buscarTodos();
        Iterator<PersistivelInterface> itAgencias = agencias.iterator();
        Agencia tempAgencia;

        this.modelo.setNumRows(0);

        while (itAgencias.hasNext()) {
            tempAgencia = (Agencia) itAgencias.next();

            int limite = this.view.getTxtFiltrar().getText().length();

            String cidade = tempAgencia.getCidade();
            String filtro = this.view.getTxtFiltrar().getText();

            if (cidade.length() < limite) {
                limite = cidade.length();
            }

            if (cidade.substring(0, limite).toLowerCase().equals(filtro.toLowerCase())) {
                this.modelo.addRow(new Object[]{tempAgencia.getCodigo(), tempAgencia.getCidade(), tempAgencia.getUf()});
            }
        }

    }

    private void addListenerBtnNova() {
        this.view.getBtnNova().addActionListener(
                new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                actionPerformedBtnNova();
            }
        });
    }

    private void actionPerformedBtnNova() {
        CrudAgenciaPresenter c = new CrudAgenciaPresenter();
        this.view.dispose();
    }

    private void addListenerBtnRecarregar() {
        this.view.getBtnRecarregar().addActionListener(
                new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                actionPerformedBtnRecarregar();
            }
        });
    }

    private void actionPerformedBtnRecarregar() {
        this.view.setCursor(new Cursor(3));
        this.loadTblAgencias();
        this.view.setCursor(new Cursor(0));
    }

    private void addListenerBtnVisualizar() {
        this.view.getBtnVisualizar().addActionListener(
                new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                actionPerformedBtnVisualizar();
            }
        });
    }

    private void actionPerformedBtnVisualizar() {

        if (this.view.getTblAgencias().getSelectedRow() != -1) {
            String codigo = (String) this.view.getTblAgencias().getValueAt(this.view.getTblAgencias().getSelectedRow(), 0);
            CrudAgenciaPresenter c = new CrudAgenciaPresenter(codigo);
            this.view.dispose();
        } else {
            this.view.showMessage("Selecione uma linha para continuar!");
        }

    }

    private void addListenerBtnExcluir() {
        this.view.getBtnExcluir().addActionListener(
                new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                actionPerformedBtnExcluir();
            }
        });
    }

    private void actionPerformedBtnExcluir() {
        if (this.view.getTblAgencias().getSelectedRow() != -1) {

            /* O padrão factory retorna a instância de acordo com a forma 
             * de persistencia selecionada
             */

            DaoInterface daoAgencia = DaoAgenciaFactory.CriarDaoAgencia(1);

            String codigo = (String) this.view.getTblAgencias().getValueAt(
                    (Integer) this.view.getTblAgencias().getSelectedRow(),
                    0);

            Agencia tempAgencia = (Agencia) daoAgencia.buscarObjeto(codigo);

            if (this.view.showConfirmMessage("Verificação de ação", "Excluir?") == 0) {
                if (daoAgencia.excluir(tempAgencia)) {
                    loadTblAgencias();
                }
            }
        } else {
            this.view.showMessage("Selecione uma linha para continuar!");
        }
    }

    private void addListenerBtnFechar() {
        this.view.getBtnFechar().addActionListener(
                new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                actionPerformedBtnFechar();
            }
        });
    }

    private void actionPerformedBtnFechar() {
        this.view.dispose();
    }
}
